package com.mmq.ets.modele;
/******************************************************
Cours:   LOG121
Session: A2013
Groupe:  04
Projet: Laboratoire #1
Étudiant: Francisco Quilodran Chavez              
Professeur : Francis Cardinal
Nom du fichier: Forme.java
Date créé: 2013-09-06
Date dern. modif. 2013-09-27
*/  
import java.awt.Color;
import java.awt.Graphics;

import com.mmq.ets.util.Labo2Const;
import com.mmq.ets.util.Labo2Const.TypeForme;

/**
Cette classe possède les configurations de base pour une forme geometrique dans le contexte du laboratoroire1, 
@author Francisco Quilodran Chavez
@version 1.1

*/
public abstract class AbstractForme implements Cloneable
{
	
	private int nseq;
	private int pointDepartX;
	private int pointDepartY;
	/**
	 * La couleur de la figure doit être définie dans les classes enfants.
	 */
	private Color couleur;
	/**
	 * Ce constructeur est defini pour faciliter l'instatiation des classe enfants
	 * 
	 * @param nseq Numéro d'identification pour une forme
	 * @param pointDepartX Point x de référence pour dessiner la figure
	 * @param pointDepartY Point y de référence pour dessiner la figure
	*/
	public AbstractForme(int nseq, int pointDepartX, int pointDepartY) 
	{
		this.nseq=nseq;
		this.pointDepartX = pointDepartX;
		this.pointDepartY = pointDepartY;
	
	}
	/**
	 * Constructeur sans arguments
	 */
	public AbstractForme()
	{
	}
	/**
	 * Comparateur de Numéro de séquence
	 * @return
	 */

	/**
	 * Accesseur du pointDepartX
	 * @return pointDepartX
	 */
	public int getPointDepartX() {
		return pointDepartX;
	}
	/**
	 * Modifie le parametre pointDepartX
	 * @param pointDepartX
	 */
	public void setPointDepartX(int pointDepartX) {
		this.pointDepartX = pointDepartX;
	}
	/**
	 * Accesseur du pointDeparty
	 * @return pointDeparty
	 */
	public int getPointDepartY() {
		return pointDepartY;
	}
	/**
	 * Modifie le parametre pointDepartY
	 * @param pointDepartY
	 */
	public void setPointDepartY(int pointDepartY) {
		this.pointDepartY = pointDepartY;
	}
	/**
	 * Accesseur de la couleur
	 * @return couleur
	 */
	public Color getCouleur() {
		return couleur;
	}
	/**
	 * Modifie le paramètre couleur
	 * @param couleur
	 */
	protected void setCouleur(Color couleur) {
		this.couleur = couleur;
	}
	/**
	 * Accesseur du numéro d'identification
	 * @return nseq
	 */
	public int getNseq() 
	{
		return nseq;
	}
	/**
	 * Modifie le paramètre du numéro d'identification
	 * @param nseq
	 */
	public void setNseq(int nseq) 
	{
		this.nseq = nseq;
	}
	/**
	 * Retourne l'ordre entier selon l'énumération de type de forme
	 * @return le nombre entier du type
	 */
	public int getTypeInteger()
	{
		for(Labo2Const.TypeForme type: Labo2Const.TypeForme.values())
		{
			 if(type.toString().equals(this.getClass().getSimpleName().toUpperCase()))
			 {
				 return type.ordinal();
			 }
		}
		return -1;
		
	}
	/**
	 * Retourne le type de la forme
	 * @return le type de la forme
	 */
	public TypeForme getType()
	{
		for(Labo2Const.TypeForme type: Labo2Const.TypeForme.values())
		{
			 if(type.toString().equals(this.getClass().getSimpleName().toUpperCase()))
			 {
				 return type;
			 }
		}
		return null;
	}
	/**
	 * Défini la signature de la méthode qui dessine la forme sur l'objet graphics passé
	 * @param g l'objet sur lequel on va dessiner
	 */
	public abstract void dessinerForme(Graphics g);
	/**
	 * Défini la signature de la méthode qui retourne l'aire de la forme
	 * @return un double représentant l'aire de la forme
	 */
	public abstract double getAire();
	/**
	 * Défini la signature de la méthode qui retourne la distance maximale entre deux points d'une forme
	 * @return un double représentant la distance maximale entre deux points de la forme
	 */
	public abstract double getDistanceMaximale();
	/**
	 * Défini la signature de la méthode qui retourne la hauteur de la forme
	 * @return un double représentant la hauteur de la forme
	 */
	public abstract double getHauteur();
	/**
	 * Défini la signature de la méthode qui retourne la largeur de la forme
	 * @return un double représentant la largeur de la forme
	 */
	public abstract double getLargeur();
	/**
	 * Méthode qui compare le numéro de séquense de deux formes
	 * @param arg0 première forme à comparer
	 * @param arg1 deuxième forme à comparer
	 * @return -1 si la première forme vient avant | 0 si les deux sont équivalentes | 1 si la deuxième forme vient avant
	 */
	public static int compareNseq(AbstractForme arg0, AbstractForme arg1) {
		return (arg0.getNseq() < arg1.getNseq()) ? -1 : (arg0.getNseq() > arg1.getNseq() ? 1 : 0);
	}
	/**
	 * Méthode qui compare l'aire de deux formes
	 * @param arg0 première forme à comparer
	 * @param arg1 deuxième forme à comparer
	 * @return -1 si la première forme vient avant | 0 si les deux sont équivalentes | 1 si la deuxième forme vient avant
	 */
	public static int compareAire(AbstractForme arg0, AbstractForme arg1) {
		return (arg0.getAire() < arg1.getAire()) ? -1 : (arg0.getAire() > arg1.getAire() ? 1 : 0);
	}
	/**
	 * Méthode qui compare la distance maximale entre deux points de deux formes
	 * @param arg0 première forme à comparer
	 * @param arg1 deuxième forme à comparer
	 * @return -1 si la première forme vient avant | 0 si les deux sont équivalentes | 1 si la deuxième forme vient avant
	 */
	public static int compareMaxDist(AbstractForme arg0, AbstractForme arg1) {
		return (arg0.getDistanceMaximale() < arg1.getDistanceMaximale()) ? -1 : (arg0.getDistanceMaximale() > arg1.getDistanceMaximale() ? 1 : 0);
	}
	/**
	 * Méthode qui compare la largeur entre deux formes
	 * @param arg0 première forme à comparer
	 * @param arg1 deuxième forme à comparer
	 * @return -1 si la première forme vient avant | 0 si les deux sont équivalentes | 1 si la deuxième forme vient avant
	 */
	public static int compareLargeur(AbstractForme arg0, AbstractForme arg1) {
		return (arg0.getLargeur() < arg1.getLargeur()) ? -1 : (arg0.getLargeur() > arg1.getLargeur() ? 1 : 0);
	}
	/**
	 * Méthode qui compare la hauteur entre deux formes
	 * @param arg0 première forme à comparer
	 * @param arg1 deuxième forme à comparer
	 * @return -1 si la première forme vient avant | 0 si les deux sont équivalentes | 1 si la deuxième forme vient avant
	 */
	public static int compareHauteur(AbstractForme arg0, AbstractForme arg1) {
		return (arg0.getHauteur() < arg1.getHauteur()) ? -1 : (arg0.getHauteur() > arg1.getHauteur() ? 1 : 0);
	}
	/**
	 * Méthode qui compare le type entre deux formes
	 * @param arg0 première forme à comparer
	 * @param arg1 deuxième forme à comparer
	 * @return -1 si la première forme vient avant | 0 si les deux sont équivalentes | 1 si la deuxième forme vient avant
	 */
	public static int compareType(AbstractForme arg0, AbstractForme arg1) {
		return (arg0.getTypeInteger() < arg1.getTypeInteger()) ? -1 : (arg0.getTypeInteger() > arg1.getTypeInteger() ? 1 : 0);
	}
	/**
	 * Méthode qui créé une copie de la forme
	 */
	@Override
	public Object clone() throws CloneNotSupportedException 
	{
		return super.clone();
	}
}
